
package ajedrez;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;


public class MainWindow extends JFrame implements MouseListener, MouseMotionListener, ActionListener
{
    private final class GUIConstraints
    {
        private final int NONE = GridBagConstraints.NONE;
        private final int BOTH = GridBagConstraints.BOTH;
        private final int SOUT = GridBagConstraints.SOUTH;
        private final int CENT = GridBagConstraints.CENTER;
        private final int WEST = GridBagConstraints.WEST;
        private final int SOEA = GridBagConstraints.SOUTHEAST;
        private final int HORI = GridBagConstraints.HORIZONTAL;
        private final int RELA = GridBagConstraints.RELATIVE;
        private final int REMA = GridBagConstraints.REMAINDER;
        private final int EAST = GridBagConstraints.EAST;

        final int[][] gMain = new int[][]
        {
            // Columna,Fila
            //{gridx,gridy}, {gridwidth,gridheight}, {fill,anchor},{inset_top, inset_left, inset_bottom, inset_right}
            {0,0},{REMA, 1},{BOTH,CENT},{0,0,0,0}, // Barra de Menu - 0
            {0,1},{REMA, 1},{BOTH,CENT},{0,0,0,0}, // Barra de Separador - 1
            {0,2},{REMA, 1},{BOTH,CENT},{0,0,0,0}, // Barra de Herramientas - 2
            {0,3},{REMA, 1},{BOTH,CENT},{1,0,4,0}, // Barra de Separador - 3

            // PANEL IZQUIERDO
            {0,4},{RELA,9},{NONE,CENT},{0,3,5,0}, // Jugador1 - 4
            {0,14},{RELA,1},{BOTH,CENT},{10,3,3,0}, // Barra de Separador - 5
            {0,15},{RELA,9},{NONE,CENT},{0,3,5,0}, // Jugador2 - 6

            // AREA GRAFICA
            {1,4},{BOTH,RELA},{BOTH,CENT},{0,3,5,3}, // Area Grafica - 7

            {0,24},{REMA, RELA},{HORI,SOUT},{3,0,0,0}, // Barra de Separador - 8

            // BARRA DE TAREAS
            {0,25}, {REMA, REMA}, {BOTH, CENT}, {2, 2, 2, 2}, // Barra de Tarea - 9
        };
        
        final double[][] wMain = new double[][]
        {
            //{weightx, weighty}
            {1.0, 0.20}, // Menu - 0
            {0.0,0.0}, // Barra de Separador - 1
            {1.0, 0.0}, // Herramientas - 2
            {0.0,0.0}, // Barra de Separador - 3

            {0.15, 0.0}, // Jugador1 - 4
            {0.0,0.0}, // Barra de Separador - 5
            {0.15, 0.0}, // Jugador2 - 6

            {1.0, 1.0}, // Area Grafica - 7

            {0.0,0.0}, // Barra de Separador - 8

            {0.0, 0.0}, // Barra de Tareas - 9
        };
    }

    private final class GUIConstraintsPlayerPanel
    {
        private final int NONE = GridBagConstraints.NONE;
        private final int BOTH = GridBagConstraints.BOTH;
        private final int SOUT = GridBagConstraints.SOUTH;
        private final int CENT = GridBagConstraints.CENTER;
        private final int WEST = GridBagConstraints.WEST;
        private final int SOEA = GridBagConstraints.SOUTHEAST;
        private final int HORI = GridBagConstraints.HORIZONTAL;
        private final int RELA = GridBagConstraints.RELATIVE;
        private final int REMA = GridBagConstraints.REMAINDER;
        private final int EAST = GridBagConstraints.EAST;

        final int[][] gMain = new int[][]
        {
            // Columna,Fila
            //{gridx,gridy}, {gridwidth,gridheight}, {fill,anchor},{inset_top, inset_left, inset_bottom, inset_right}
            {0,0},{2,1},{NONE,CENT},{0,3,10,0}, // [Nombre] - 0
            {0,1},{1,1},{BOTH,EAST},{3,3,2,0}, // Movimientos - 1
            {1,1},{1,1},{BOTH,WEST},{4,3,2,0}, // [Movimientos] - 2
            {0,2},{1,1},{BOTH,EAST},{4,3,2,0}, // Tiempo - 3
            {1,2},{1,1},{BOTH,WEST},{4,3,2,0}, // [Tiempo] - 4
            {0,3},{1,1},{BOTH,EAST},{4,3,2,0}, // Rey - 5
            {1,3},{1,1},{BOTH,EAST},{4,3,2,0}, // [Rey] - 6
            {0,4},{1,1},{BOTH,EAST},{4,3,2,0}, // Reinas - 7
            {1,4},{1,1},{BOTH,WEST},{4,3,2,0}, // [Reinas] - 8
            {0,5},{1,1},{BOTH,EAST},{4,3,2,0}, // Torre - 9
            {1,5},{1,1},{BOTH,EAST},{4,3,2,0}, // [Torre] - 10
            {0,6},{1,1},{BOTH,EAST},{4,3,2,0}, // Alfil - 11
            {1,6},{1,1},{BOTH,EAST},{4,3,2,0}, // [Alfil] - 12
            {0,7},{1,1},{BOTH,EAST},{4,3,2,0}, // Caballo - 13
            {1,7},{1,1},{BOTH,EAST},{4,3,2,0}, // [Caballo] - 14
            {0,8},{1,1},{BOTH,EAST},{4,3,2,0}, // Peon - 15
            {1,8},{1,1},{BOTH,WEST},{4,3,2,0}, // [Peon] - 16
        };
        final double[][] wMain = new double[][]
        {
            //{weightx, weighty}
            {0.15, 0.0}, // [Nombre] - 0
            {0.0, 0.0}, // Movimientos - 1
            {0.15, 0.0}, // [Movimientos] - 2
            {0.0, 0.0}, // Tiempo - 3
            {0.15, 0.0}, // [Tiempo] - 4
            {0.0, 0.0}, // Rey - 5
            {0.15, 0.0}, // [Rey] - 6
            {0.0, 0.0}, // Reinas - 7
            {0.15, 0.0}, // [Reinas] - 8
            {0.0, 0.0}, // Torre - 9
            {0.15, 0.0}, // [Torre] - 10
            {0.0, 0.0}, // Alfil - 11
            {0.15, 0.0}, // [Alfil] - 12
            {0.0, 0.0},// Caballo - 13
            {0.15, 0.0}, // [Caballo] - 14
            {0.0, 0.0}, // Peon - 15
            {0.15, 0.0}, // [Peon] - 16
        };
    }
    

    public MainWindow()
    {
        BuildUserInterface();
        this.setTitle("Main Window");
        this.setResizable(false);
        this.setSize(750,675);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        this.addWindowListener(new WindowAdapter ()
            {
                public void windowClosing(WindowEvent e)
                {
                    abreDialogo();
                }
            }
        );
    }

    // BARRA DE MENU
    private JMenuBar menubar = new JMenuBar();
    // MENUS
    // Juego
    private JMenu menuJuego = new JMenu("Juego");
    private JMenuItem itemNuevo = new JMenuItem("Nuevo");
    private JMenuItem itemAbrir = new JMenuItem("Abrir");
    private JMenuItem itemGuardar = new JMenuItem("Guardar");
    private JMenuItem itemGuardarC = new JMenuItem("Guardar como...");
    private JMenuItem itemSalir = new JMenuItem("Salir");
    // Configuracion
    private JMenu menuConfiguracion = new JMenu("Configuración");
    private JMenuItem itemPreferencias = new JMenuItem("Preferencias");
    // Ayuda
    private JMenu menuAyuda = new JMenu("Ayuda");
    private JMenuItem itemAcercaDe = new JMenuItem("Acerca de...");
    
//*************************en linux cambian las url "img\\imagen.png a img\\imagen.png"
    //****************reemplazar en WINDOWS "img\\" por "img\\"
    String vsPathImgNuevo_16 = "img\\new_16.png";
    String vsPathImgFolder_16 = "img\\folder_16.png";
    String vsPathImgGuardar_16 = "img\\save_16.png";
    String vsPathImgGuardarComo_16 = "img\\library_16.png";
    String vsPathImgSalir_16 = "img\\log_out_16.png";
    String vsPathImgConfigurar_16 = "img\\settings_16.png";
    String vsPathImgAyuda_16 = "img\\help_16.png";

    private void BuildMenu()
    {
        itemNuevo.setIcon(new ImageIcon(getClass().getResource(vsPathImgNuevo_16)));
        itemAbrir.setIcon(new ImageIcon(getClass().getResource(vsPathImgFolder_16)));
        itemGuardar.setIcon(new ImageIcon(getClass().getResource(vsPathImgGuardar_16)));
        itemGuardarC.setIcon(new ImageIcon(getClass().getResource(vsPathImgGuardarComo_16)));
        itemSalir.setIcon(new ImageIcon(getClass().getResource(vsPathImgSalir_16)));

        itemPreferencias.setIcon(new ImageIcon(getClass().getResource(vsPathImgConfigurar_16)));

        itemAcercaDe.setIcon(new ImageIcon(getClass().getResource(vsPathImgAyuda_16)));

        // Menus
        menubar.add(menuJuego);
        menubar.add(menuConfiguracion);
        menubar.add(Box.createHorizontalGlue());
        menubar.add(menuAyuda);
        // Juego
        menuJuego.add(itemNuevo);
        menuJuego.add(new JSeparator());
        menuJuego.add(itemAbrir);
        menuJuego.add(itemGuardar);
        menuJuego.add(itemGuardarC);
        menuJuego.add(new JSeparator()); // Una rayita separadora.
        menuJuego.add(itemSalir);
        // Preferencias
        menuConfiguracion.add(itemPreferencias);
        // Ayuda
         menuAyuda.add(itemAcercaDe);
    }


    // BARRA DE HERRAMIENTAS
    private JButton btnNuevo = new JButton();
    private JButton btnGuardar = new JButton();
    private JButton btnIniciar = new JButton();
    private JButton btnDetener = new JButton();
    private JButton btnTerminar = new JButton();
    private JButton btnEstadisticas = new JButton();

    
    String vsPathImgNuevo_32 = "img\\new_32.png";
    String vsPathImgGuardar_32 = "img\\save_32.png";
    String vsPathImgIniciar_32 = "img\\play_32.png";
    String vsPathImgPausa_32 = "img\\pause_32.png";
    String vsPathImgDetener_32 = "img\\stop_32.png";
    String vsPathImgEstadisticas_32 = "img\\diagram_32.png";
    
    // BARRA DE HERRAMIENTAS
    private JToolBar toolbar = new JToolBar();
    
    private void BuildBarraHerramienta()
    {
        btnNuevo.setIcon(new ImageIcon(getClass().getResource(vsPathImgNuevo_32)));
        btnNuevo.setToolTipText("Nuevo Juego");

        btnGuardar.setIcon(new ImageIcon(getClass().getResource(vsPathImgGuardar_32)));
        btnIniciar.setIcon(new ImageIcon(getClass().getResource(vsPathImgIniciar_32)));
        btnDetener.setIcon(new ImageIcon(getClass().getResource(vsPathImgPausa_32)));
        btnTerminar.setIcon(new ImageIcon(getClass().getResource(vsPathImgDetener_32)));
        btnEstadisticas.setIcon(new ImageIcon(getClass().getResource(vsPathImgEstadisticas_32)));
     
        toolbar.add(btnNuevo);
        toolbar.add(btnGuardar);
        toolbar.addSeparator();
        toolbar.add(btnIniciar);
        toolbar.add(btnDetener);
        toolbar.add(btnTerminar);
        toolbar.addSeparator();
        toolbar.add(btnEstadisticas);
    }


    // Dibuja el panel izquierdo de la interfaz.
    JPanel cPanelJugador1 = new JPanel();
    JPanel cPanelJugador2 = new JPanel();

    JLabel lblNombre1 = new JLabel();
    JLabel lblNombre2 = new JLabel();

    JLabel lblMovimientos1 = new JLabel();
    JLabel lblMovimientos2 = new JLabel();
    JLabel lblMovValor1 = new JLabel();
    JLabel lblMovValor2 = new JLabel();

    JLabel lblTiempo1 = new JLabel();
    JLabel lblTiempo2 = new JLabel();
    JLabel lblTieValor1 = new JLabel();
    JLabel lblTieValor2 = new JLabel();

    JLabel lblBajas1 = new JLabel();
    JLabel lblBajas2 = new JLabel();
    JLabel lblBajasValor1 = new JLabel();
    JLabel lblBajasValor2 = new JLabel();

    String vsPathImgMovAbajo_48 = "img\\down_48.png";
    String vsPathImgMovArriba_48 = "img\\up_48.png";
    String vsPathImgReloj_48 = "img\\alarm_clock_48.png";
    String vsPathImgSkull_48 = "img\\head_48.png";

    String vsPathTablero = "img\\tablero.png";

    int viFontSize = 14;
    Color vcTituloJugador1 = Color.BLACK;
    Color vcTituloJugador2 = Color.BLACK;
    Color vcNumeros = Color.BLACK;

    private void BuildPanel()
    {
        // Panel del Jugador 1
        cPanelJugador1.setBorder(BorderFactory.createTitledBorder(""));
        cPanelJugador1.setLayout(new GridBagLayout());
        cPanelJugador1.setPreferredSize(new Dimension(300, 400));

        // Panel del Jugador 2
        cPanelJugador2.setBorder(BorderFactory.createTitledBorder(""));
        cPanelJugador2.setLayout(new GridBagLayout());
        cPanelJugador2.setPreferredSize(new Dimension(300, 400));

        // Los mismos Constraints aplican para los dos paneles.
        GUIConstraintsPlayerPanel panelContraints1 = new GUIConstraintsPlayerPanel();
        ConstraintGroup cgPanel1 = new ConstraintGroup(panelContraints1.gMain,panelContraints1.wMain);

        GUIConstraintsPlayerPanel panelContraints2 = new GUIConstraintsPlayerPanel();
        ConstraintGroup cgPanel2 = new ConstraintGroup(panelContraints2.gMain,panelContraints2.wMain);
        
        cPanelJugador1.add(lblNombre1,cgPanel1.getConstraints(0));
        cPanelJugador1.add(lblMovimientos1,cgPanel1.getConstraints(1));
        cPanelJugador1.add(lblMovValor1,cgPanel1.getConstraints(2));
        cPanelJugador1.add(lblTiempo1,cgPanel1.getConstraints(3));
        cPanelJugador1.add(lblTieValor1,cgPanel1.getConstraints(4));
        cPanelJugador1.add(lblBajas1,cgPanel1.getConstraints(5));
        cPanelJugador1.add(lblBajasValor1,cgPanel1.getConstraints(6));
        
        cPanelJugador2.add(lblNombre2,cgPanel2.getConstraints(0));
        cPanelJugador2.add(lblMovimientos2,cgPanel2.getConstraints(1));
        cPanelJugador2.add(lblMovValor2,cgPanel2.getConstraints(2));
        cPanelJugador2.add(lblTiempo2,cgPanel2.getConstraints(3));
        cPanelJugador2.add(lblTieValor2,cgPanel2.getConstraints(4));
        cPanelJugador2.add(lblBajas2,cgPanel2.getConstraints(5));
        cPanelJugador2.add(lblBajasValor2,cgPanel2.getConstraints(6));


        lblNombre1.setText("[JUGADOR 1]");
        lblNombre1.setHorizontalAlignment(JLabel.CENTER);
        lblNombre1.setFont(new Font("Verdana", Font.BOLD, viFontSize));
        lblNombre1.setForeground(vcTituloJugador1);
        lblNombre2.setText("[JUGADOR 2]");
        lblNombre2.setHorizontalAlignment(JLabel.CENTER);
        lblNombre2.setFont(new Font("Verdana", Font.BOLD, viFontSize));
        lblNombre2.setForeground(vcTituloJugador2);

        lblMovimientos1.setIcon(new ImageIcon(getClass().getResource(vsPathImgMovAbajo_48)));
        lblMovimientos1.setHorizontalAlignment(JLabel.CENTER);
        lblMovimientos2.setIcon(new ImageIcon(getClass().getResource(vsPathImgMovArriba_48)));
        lblMovimientos2.setHorizontalAlignment(JLabel.CENTER);
        lblMovValor1.setText("0");
        lblMovValor1.setHorizontalAlignment(JLabel.CENTER);
        lblMovValor1.setFont(new Font("Verdana", Font.BOLD, viFontSize));
        lblMovValor1.setForeground(vcNumeros);
        lblMovValor2.setText("0");
        lblMovValor2.setHorizontalAlignment(JLabel.CENTER);
        lblMovValor2.setFont(new Font("Verdana", Font.BOLD, viFontSize));
        lblMovValor2.setForeground(vcNumeros);

        lblTiempo1.setIcon(new ImageIcon(getClass().getResource(vsPathImgReloj_48)));
        lblTiempo1.setHorizontalAlignment(JLabel.CENTER);
        lblTiempo2.setIcon(new ImageIcon(getClass().getResource(vsPathImgReloj_48)));
        lblTiempo2.setHorizontalAlignment(JLabel.CENTER);
        lblTieValor1.setText("0");
        lblTieValor1.setHorizontalAlignment(JLabel.CENTER);
        lblTieValor1.setFont(new Font("Verdana", Font.BOLD, viFontSize));
        lblTieValor1.setForeground(vcNumeros);
        lblTieValor2.setText("0");
        lblTieValor2.setHorizontalAlignment(JLabel.CENTER);
        lblTieValor2.setFont(new Font("Verdana", Font.BOLD, viFontSize));
        lblTieValor2.setForeground(vcNumeros);

        lblBajas1.setIcon(new ImageIcon(getClass().getResource(vsPathImgSkull_48)));
        lblBajas2.setIcon(new ImageIcon(getClass().getResource(vsPathImgSkull_48)));
        lblBajasValor1.setText("0");
        lblBajasValor1.setHorizontalAlignment(JLabel.CENTER);
        lblBajasValor1.setFont(new Font("Verdana", Font.BOLD, viFontSize));
        lblBajasValor1.setForeground(vcNumeros);
        lblBajasValor2.setText("0");
        lblBajasValor2.setHorizontalAlignment(JLabel.CENTER);
        lblBajasValor2.setFont(new Font("Verdana", Font.BOLD, viFontSize));
        lblBajasValor2.setForeground(vcNumeros);
    }

    // TABLERO DE JUEGO
    private JPanel cPanelTablero = new JPanel();
    private JLayeredPane jlpCapaTablero = new JLayeredPane();
    private JPanel jpTableroJuego = new JPanel();

    // Dibuja el tablero de juego
    private void BuildTablero()
    {
        Dimension dimTablero = new Dimension(500, 500);

        jlpCapaTablero.setPreferredSize(dimTablero);

        // Lisener de eventos.
        jlpCapaTablero.addMouseListener(this);
        jlpCapaTablero.addMouseMotionListener(this);
        // Configuracion de la capa del tablero.
        jlpCapaTablero.add(jpTableroJuego,JLayeredPane.DEFAULT_LAYER);
        jpTableroJuego.setLayout(new GridLayout(8,8));
        jpTableroJuego.setPreferredSize(dimTablero);
        jpTableroJuego.setBounds(0,0,dimTablero.width,dimTablero.height);

        for(int i = 1; i < 9; i++)
        {
            for(int j = 1; j < 9; j++)
            {
                JPanel jpCelda = new JPanel(new BorderLayout());
                jpTableroJuego.add(jpCelda);

                if(i%2 != 0)
                {
                    if(j%2 != 0)
                        jpCelda.setBackground(Color.orange);
                    else
                        jpCelda.setBackground(Color.white);
                }
                else
                {
                    if(j%2 != 0)
                        jpCelda.setBackground(Color.white);
                    else
                        jpCelda.setBackground(Color.orange);
                }
            }
        }


        cPanelTablero.setBorder(BorderFactory.createTitledBorder(""));
        cPanelTablero.setLayout(new FlowLayout());
        cPanelTablero.setPreferredSize(new Dimension(601, 601));
        cPanelTablero.add(jlpCapaTablero);
    }


    // Carga las piesas de ajedrez en el tablero
    String vsPathImgReyBlanco = "img\\rey_blanco.png";
    String vsPathImgReinaBlanca = "img\\reina_blanca.png";
    String vsPathImgTorreBlanca = "img\\torre_blanca.png";
    String vsPathImgAlfilBlanco = "img\\alfil_blanco.png";
    String vsPathImgCaballoBlanco = "img\\caballo_blanco.png";
    String vsPathImgPeonBlanco = "img\\peon_blanco.png";

    String vsPathImgReyNegro = "img\\rey_negro.png";
    String vsPathImgReinaNegra = "img\\reina_negra.png";
    String vsPathImgTorreNegra = "img\\torre_negra.png";
    String vsPathImgAlfilNegro = "img\\alfil_negro.png";
    String vsPathImgCaballoNegro = "img\\caballo_negro.png";
    String vsPathImgPeonNegro = "img\\peon_negro.png";
    public void limpiarTablero(){
        JLabel tmpPiesa = new JLabel();
        for(int i=0; i<Tablero.TableroNuevo.length;i++){
            tmpPiesa = new JLabel();
            JPanel pnlContenedor = (JPanel)jpTableroJuego.getComponent(i);
            pnlContenedor.add(tmpPiesa);
            pnlContenedor.removeAll();
        }
    }

    public void CargarTableroJuegoComputadora(){
        limpiarTablero();
        JLabel tmpPiesa = new JLabel();
        String tmpPath ="";
        for(int i=0; i<Tablero.TableroNuevo.length;i++){
            tmpPath = intPiezaToImagen(Tablero.TableroNuevo[i]);
            System.out.println("Path:"+tmpPath);
            tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(tmpPath)));
            JPanel pnlContenedor = (JPanel)jpTableroJuego.getComponent(i);
            pnlContenedor.add(tmpPiesa);
        }
    }

    private void InicarTablero()
    {
        // PIESAS NEGRAS (SUPERIOR)
        JLabel tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgTorreNegra)));
        JPanel pnlContenedor = (JPanel)jpTableroJuego.getComponent(0);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgCaballoNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(1);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgAlfilNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(2);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgReyNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(3);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgReinaNegra)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(4);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgAlfilNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(5);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgCaballoNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(6);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgTorreNegra)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(7);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(8);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(9);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(10);
        pnlContenedor.add(tmpPiesa);
        
        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(11);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(12);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(13);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(14);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonNegro)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(15);
        pnlContenedor.add(tmpPiesa);

        // PIESAS BLANCAS INFERIOR
        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgTorreBlanca)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(63);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgCaballoBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(62);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgAlfilBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(61);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgReyBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(60);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgReinaBlanca)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(59);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgAlfilBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(58);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgCaballoBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(57);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgTorreBlanca)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(56);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(55);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(54);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(53);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(52);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(51);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(50);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(49);
        pnlContenedor.add(tmpPiesa);

        tmpPiesa = new JLabel(new ImageIcon(getClass().getResource(vsPathImgPeonBlanco)));
        pnlContenedor = (JPanel)jpTableroJuego.getComponent(48);
        pnlContenedor.add(tmpPiesa);
    }

    // Se dibuja la Intefaz
    Container container = this.getContentPane();
    private void BuildUserInterface()
    {
        container.setLayout(new GridBagLayout());
        //((JPanel)container).setBorder(BorderFactory.createTitledBorder("Prueba de GridBagLayout"));

        this.BuildMenu();
        this.BuildBarraHerramienta();
        this.BuildPanel();
        this.BuildTablero();
        this.InicarTablero();
        

        // Area de Juego
        JLabel lblAreaGrafica = new JLabel(new ImageIcon(getClass().getResource(vsPathTablero)));
        lblAreaGrafica.setBorder(BorderFactory.createBevelBorder(1));


        // Status BAR
        JTextField statusBar = new JTextField();
        statusBar.setEnabled(false);

        GUIConstraints cons = new GUIConstraints();
        ConstraintGroup cg = new ConstraintGroup(cons.gMain,cons.wMain);

        container.add(menubar,cg.getConstraints(0));
        container.add(new JSeparator(),cg.getConstraints(1));
        container.add(toolbar,cg.getConstraints(2));
        container.add(new JSeparator(),cg.getConstraints(3));

        container.add(cPanelJugador1,cg.getConstraints(4));

        container.add(new JSeparator(),cg.getConstraints(5));

        container.add(cPanelJugador2,cg.getConstraints(6));
        
        container.add(cPanelTablero,cg.getConstraints(7));

        container.add(new JSeparator(),cg.getConstraints(8));

        container.add(statusBar,cg.getConstraints(9));
    }

    // Pregunta si de desea salir de la aplicacion.
    private void abreDialogo ()
    {
        int confirmado = JOptionPane.showConfirmDialog(this,"¿Realmente desea salir?","Espere", JOptionPane.YES_NO_OPTION);

        if (JOptionPane.OK_OPTION == confirmado)
        {
                setDefaultCloseOperation(EXIT_ON_CLOSE);
                setVisible(false);
                dispose();
        }
    }

    //---------------------------------------------------------------------------------------//
    //----------------------------- MANEJO DE EVENTOS  --------------------------------------//
    //---------------------------------------------------------------------------------------//

    public void actionPerformed(ActionEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    public void mouseClicked(MouseEvent e)
    {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    private JLabel lblPieza;
    int viPosX;
    int viPosY;
    public void mousePressed(MouseEvent e)
    {
        lblPieza = null;
        Component c =  this.jpTableroJuego.findComponentAt(e.getX(), e.getY());
        if (c instanceof JPanel)
            return;

        Point parentLocation = c.getParent().getLocation();
        viPosX = parentLocation.x - e.getX();
        viPosY = parentLocation.y - e.getY();
        lblPieza = (JLabel)c;
        lblPieza.setLocation(e.getX() + viPosX, e.getY() + viPosY);
        lblPieza.setSize(lblPieza.getWidth(), lblPieza.getHeight());
        this.jlpCapaTablero.add(lblPieza, JLayeredPane.DRAG_LAYER);
        Tablero.mvTablero(Tablero.TableroAnterior, Tablero.TableroNuevo);
        Container parent = (Container)c;
        getPosJuego(parent.getX(),parent.getY());
        Tablero.TableroNuevo[getPosJuego(parent.getX(),parent.getY())]=Tablero.LIBRE;
    }

    public void mouseReleased(MouseEvent e)
    {
        if(lblPieza == null)
            return;

        lblPieza.setVisible(false);

        Component c =  jpTableroJuego.findComponentAt(e.getX(), e.getY());        
        if (c instanceof JLabel)
        {
            Container parent = c.getParent();
            parent.remove(0);
            parent.add( lblPieza );
            Tablero.TableroNuevo[getPosJuego(parent.getX(),parent.getY())]=ImagenTointPieza(lblPieza.getIcon().toString());
        }
        else
        {
            Container parent = (Container)c;
            parent.add( lblPieza );
            Tablero.TableroNuevo[getPosJuego(parent.getX(),parent.getY())]=ImagenTointPieza(lblPieza.getIcon().toString());
        }

        lblPieza.setVisible(true);
        System.out.println("Juagada Humano");
        Tablero.ImprimirMovimientoFrontEnd(Tablero.TableroAnterior, Tablero.TableroNuevo);
        ejemploJugada();
    }

    public void ejemploJugada(){
        int jugadorMAX = Tablero.BLANCAS; // La computadora tira con las negras. Las negras son las negativas.
        int jugadorMIN = Tablero.NEGRAS; // El usuario tira con las blancas.

        JugadorArtificial computadora = new JugadorArtificial(jugadorMAX, jugadorMIN); // Se crea e inicializa el objeto de inteligencia artifical.

        /*
         * Como se puede dar cuenta TableroNuevo contiene la nueva jugada de ajedrez, entonces este seria el
         * nuevo tablero a dibujar en la interfaz.
         */

        int[] TableroActual = computadora.getJugada(Tablero.TableroNuevo); // Se obtiene la jugada de la computadora.
        Tablero.mvTablero(Tablero.TableroAnterior, Tablero.TableroNuevo);
        Tablero.mvTablero(Tablero.TableroNuevo, TableroActual);
        System.out.println("Jugada de la computadora\n");
        Tablero.ImprimirMovimientoFrontEnd(Tablero.TableroAnterior, Tablero.TableroNuevo); // Con esto estoy debugenado ahorita.
        CargarTableroJuegoComputadora();
    }

    public int getPosJuego(int X, int Y){
        int temp=-1, pos=1000;
        for(int y=0;y<435;y=y+62){
            for(int x=0;x<435;x=x+62){
                temp++;
                if(X==x&&Y==y){                    
                    pos=temp;
                }
            }
        }
        System.out.println("pos:"+pos);
        return pos;
    }
    public int ImagenTointPieza(String URLimagen){        
        String imagen = URLimagen.substring(URLimagen.lastIndexOf("\\")+1);//WINDOWS
        int intPieza = 100;
        if(imagen.equalsIgnoreCase("alfil_blanco.png")){
            intPieza = Tablero.ALFIL*Tablero.BLANCAS;
        }else if(imagen.equalsIgnoreCase("alfil_negro.png")){
                  intPieza = Tablero.ALFIL*Tablero.NEGRAS;
              }else if(imagen.equalsIgnoreCase("caballo_blanco.png")){
                    intPieza = Tablero.CABALLO*Tablero.BLANCAS;
                }else if(imagen.equalsIgnoreCase("caballo_negro.png")){
                          intPieza = Tablero.CABALLO*Tablero.NEGRAS;
                      }else if(imagen.equalsIgnoreCase("peon_blanco.png")){
                            intPieza = Tablero.PEON*Tablero.BLANCAS;
                        }else if(imagen.equalsIgnoreCase("peon_negro.png")){
                                  intPieza = Tablero.PEON*Tablero.NEGRAS;
                              }else if(imagen.equalsIgnoreCase("reina_blanca.png")){
                                    intPieza = Tablero.DAMA*Tablero.BLANCAS;
                                }else if(imagen.equalsIgnoreCase("reina_negra.png")){
                                          intPieza = Tablero.DAMA*Tablero.NEGRAS;
                                      }else if(imagen.equalsIgnoreCase("rey_blanco.png")){
                                            intPieza = Tablero.REY*Tablero.BLANCAS;
                                        }else if(imagen.equalsIgnoreCase("rey_negro.png")){
                                                  intPieza = Tablero.REY*Tablero.NEGRAS;
                                              }else if(imagen.equalsIgnoreCase("torre_blanca.png")){
                                                    intPieza = Tablero.TORRE*Tablero.BLANCAS;
                                                }else if(imagen.equalsIgnoreCase("torre_negra.png")){
                                                          intPieza = Tablero.TORRE*Tablero.NEGRAS;
                                                      }        
        return intPieza;
    }
    public String intPiezaToImagen(int intPieza){        
        switch(intPieza){
            case -6:{return vsPathImgReyNegro;}
            case -5:{return vsPathImgReinaNegra;}
            case -4:{return vsPathImgTorreNegra;}
            case -3:{return vsPathImgAlfilNegro;}
            case -2:{return vsPathImgCaballoNegro;}
            case -1:{return vsPathImgPeonNegro;}
            case 0:{return "";}
            case 1:{return vsPathImgPeonBlanco;}
            case 2:{return vsPathImgCaballoBlanco;}
            case 3:{return vsPathImgAlfilBlanco;}
            case 4:{return vsPathImgTorreBlanca;}
            case 5:{return vsPathImgReinaBlanca;}
            case 6:{return vsPathImgReyBlanco;}
            default: break;
        }
        return null;
    }
    
    public void mouseEntered(MouseEvent e)
    {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    public void mouseExited(MouseEvent e)
    {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    public void mouseDragged(MouseEvent e)
    {
        if (lblPieza == null)
            return;
        lblPieza.setLocation(e.getX() + viPosX, e.getY() + viPosY);
    }

    public void mouseMoved(MouseEvent e)
    {
        //throw new UnsupportedOperationException("Not supported yet.");
    }
}
